/* * * This is a simple Content Management System (CMS) * Copyright (C) 2010 Imran M Yousuf (imyousuf@smartitengineering.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.smartitengineering.cms.ws.resources.workspace; import com.smartitengineering.cms.api.factory.SmartContentAPI; import com.smartitengineering.cms.api.common.TemplateType; import com.smartitengineering.cms.api.workspace.VariationTemplate; import com.smartitengineering.cms.api.workspace.Workspace; import com.smartitengineering.cms.api.factory.workspace.WorkspaceAPI; import com.smartitengineering.cms.api.workspace.WorkspaceId; import com.smartitengineering.cms.ws.common.domains.ResourceTemplateImpl; import com.smartitengineering.cms.ws.resources.domains.Factory; import com.smartitengineering.util.rest.server.AbstractResource; import com.smartitengineering.util.rest.server.ServerResourceInjectables; import com.sun.jersey.multipart.FormDataParam; import java.util.Date; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Produces; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.EntityTag; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriBuilder; import org.apache.commons.lang.StringUtils; /** * * @author imyousuf */ public class WorkspaceVariationResource extends AbstractResource { private final String varName; private final VariationTemplate template; private final Workspace workspace; public WorkspaceVariationResource(String varName, Workspace workspace, ServerResourceInjectables injectables) { super(injectables); this.varName = varName; this.workspace = workspace; template = SmartContentAPI.getInstance().getWorkspaceApi().getVariationTemplate(workspace.getId(), varName); } @GET @Produces(MediaType.APPLICATION_JSON) public Response get() { if (template == null) { return Response.status(Response.Status.NOT_FOUND).build(); } Date lastModifiedDate = template.getLastModifiedDate(); EntityTag tag = new EntityTag(WorkspaceRepresentationResource.getETag(template)); ResponseBuilder builder = getContext().getRequest().evaluatePreconditions(lastModifiedDate, tag); if (builder == null) { builder = Response.ok(); builder.entity(Factory.getResourceTemplate(template)); builder.lastModified(template.getLastModifiedDate()); builder.tag(tag); CacheControl control = new CacheControl(); control.setMaxAge(300); builder.cacheControl(control); } return builder.build(); } @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response postVariationsForm(@FormDataParam("templateType") String templateType, @FormDataParam("templateData") byte[] templateData) { if (StringUtils.isBlank(templateType) || templateData == null || templateData.length <= 0) { return Response.status(Response.Status.BAD_REQUEST).build(); } try { TemplateType.valueOf(templateType); } catch (Exception ex) { return Response.status(Response.Status.BAD_REQUEST).entity(ex.getMessage()).build(); } ResourceTemplateImpl newTemplate = new ResourceTemplateImpl(); newTemplate.setName(varName); newTemplate.setTemplate(templateData); newTemplate.setTemplateType(templateType); WorkspaceVariationResource resource = new WorkspaceVariationResource(newTemplate.getName(), workspace, getInjectables()); return resource.put(newTemplate, "*"); } @PUT @Consumes(MediaType.APPLICATION_JSON) public Response put(com.smartitengineering.cms.ws.common.domains.ResourceTemplate template, @HeaderParam( HttpHeaders.IF_MATCH) String ifMatchHeader) { ResponseBuilder builder; WorkspaceId id = workspace.getId(); if (this.template == null) { final WorkspaceAPI workspaceApi = SmartContentAPI.getInstance().getWorkspaceApi(); VariationTemplate created = workspaceApi.putVariationTemplate(workspaceApi.createWorkspaceId( id.getGlobalNamespace(), id.getName()), varName, TemplateType.valueOf(template.getTemplateType()), template. getTemplate()); if (created != null) { UriBuilder uriBuilder = getAbsoluteURIBuilder().path(WorkspaceResource.class).path( WorkspaceResource.PATH_VARIATIONS).path("name").path(varName); builder = Response.created(uriBuilder.build(id.getGlobalNamespace(), id.getName())); } else { builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); } } else { if (StringUtils.isBlank(ifMatchHeader)) { return Response.status(Status.PRECONDITION_FAILED).build(); } Date lastModifiedDate = this.template.getLastModifiedDate(); EntityTag entityTag = new EntityTag(WorkspaceRepresentationResource.getETag(this.template)); builder = getContext().getRequest().evaluatePreconditions(lastModifiedDate, entityTag); if (builder == null) { final WorkspaceAPI workspaceApi = SmartContentAPI.getInstance().getWorkspaceApi(); VariationTemplate put = workspaceApi.putVariationTemplate(workspaceApi.createWorkspaceId(id.getGlobalNamespace(), id. getName()), varName, TemplateType.valueOf(template.getTemplateType()), template.getTemplate()); if (put != null) { builder = Response.status(Status.ACCEPTED).location(getUriInfo().getRequestUri()); } else { builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); } } } return builder.build(); } @DELETE public Response delete(@HeaderParam(HttpHeaders.IF_MATCH) String ifMatchHeader) { if (template == null) { return Response.status(Status.NOT_FOUND).build(); } if (StringUtils.isBlank(ifMatchHeader)) { return Response.status(Status.PRECONDITION_FAILED).build(); } Date lastModifiedDate = template.getLastModifiedDate(); EntityTag entityTag = new EntityTag(WorkspaceRepresentationResource.getETag(template)); ResponseBuilder builder = getContext().getRequest().evaluatePreconditions(lastModifiedDate, entityTag); if (builder == null) { final WorkspaceAPI workspaceApi = SmartContentAPI.getInstance().getWorkspaceApi(); try { workspaceApi.delete(template); builder = Response.status(Status.ACCEPTED); } catch (Exception ex) { builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); } } return builder.build(); } }